﻿using System;
using System.Data;
using System.Windows.Forms;

namespace Gestión_UTN.View.alta
{
    public partial class AltaNotas : Form
    {
        private static Gestión_UTN.bl.notabl createNota = Gestión_UTN.factories.blfactory.createNota();
        private static Gestión_UTN.bl.alumnobl createAlumno = Gestión_UTN.factories.blfactory.createAlumno();
        private static Gestión_UTN.bl.inscripcionExamenbl createInsExamen = Gestión_UTN.factories.blfactory.createInscripcionExamen();
        private static Gestión_UTN.bl.aprobadabl createAprobada = Gestión_UTN.factories.blfactory.createAprobada();
        private static Gestión_UTN.bl.regularidadbl createRegularidad = Gestión_UTN.factories.blfactory.createRegularidad();
        private static Gestión_UTN.bl.materiabl createMateria = Gestión_UTN.factories.blfactory.createMateria();

        private static DataTable notas;
        private static int dni;
        private static int fe_id;

        public AltaNotas()
        {
            InitializeComponent();
        }

        private void AltaNotas_Load(object sender, EventArgs e)
        {
            notas = createNota.FindAllNotas();

            if (null != notas)
            {
                this.navegador.BindingSource = this.bsource;
                this.bsource.DataSource = notas;
                this.dgvExamenes.DataSource = this.bsource;

                string[] filtros = { "DNI", "Nombre", "Apellido", "Materia" };

                this.tscmbFiltro.Items.AddRange(filtros);

                this.tscmbFiltro.Text = "Filtrar por...";

                this.dgvExamenes.Columns.Remove("fe_id");
                this.dgvExamenes.Columns[0].HeaderText = "DNI";
                this.dgvExamenes.Columns[0].ReadOnly = true;
                this.dgvExamenes.Columns[1].HeaderText = "Nombre";
                this.dgvExamenes.Columns[1].ReadOnly = true;
                this.dgvExamenes.Columns[2].HeaderText = "Apellido";
                this.dgvExamenes.Columns[2].ReadOnly = true;
                this.dgvExamenes.Columns[3].HeaderText = "Tipo de Examen";
                this.dgvExamenes.Columns[3].ReadOnly = true;
                this.dgvExamenes.Columns[4].HeaderText = "Materia";
                this.dgvExamenes.Columns[4].ReadOnly = true;
                this.dgvExamenes.Columns[5].HeaderText = "Carrera";
                this.dgvExamenes.Columns[5].ReadOnly = true;
                this.dgvExamenes.Columns[6].HeaderText = "Fecha de Examen";
                this.dgvExamenes.Columns[6].ReadOnly = true;
                this.dgvExamenes.Columns[7].HeaderText = "Nota";
                this.dgvExamenes.Columns[7].ReadOnly = false;
            }
        }

        private void tsbtnExportar_Click(object sender, EventArgs e)
        {
            try
            {
                Gestión_UTN.util.Herramientas.exportarAExcel(dgvExamenes, "Notas");
            }
            catch (Exception ex)
            {
                MessageBox.Show("Error al Intentar Exportar!!", "Alerta", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);

                Gestión_UTN.util.EscribirLog.escribirArchivo(ex.Message);
            }

        }

        private void bindingNavigatorAddNewItem_Click(object sender, EventArgs e)
        {
            try
            {
                if (0 != dni && 0 != fe_id)
                {
                    string nota = this.dgvExamenes.CurrentRow.Cells[7].Value.ToString();

                    bo.Alumnobo alu = new bo.Alumnobo();

                    alu.Dni = dni;

                    bo.FechaExamenbo fechaExamen = new bo.FechaExamenbo();

                    fechaExamen.Fe_id = fe_id;

                    bo.Notabo n = new bo.Notabo(alu, fechaExamen, nota);

                    bool ingresada = createNota.SaveNota(n);

                    if (ingresada)
                    {
                        MessageBox.Show("Nota Registrada!!", "Exito", MessageBoxButtons.OK, MessageBoxIcon.Information);

                        double calificacion = Convert.ToDouble(this.dgvExamenes.CurrentRow.Cells[7].Value.ToString());

                        if (this.dgvExamenes.CurrentRow.Cells[3].Value.ToString().Equals("Final") && calificacion >= 4)
                        {
                            bo.Aprobadabo apr = new bo.Aprobadabo();

                            apr.Alumno = alu;

                            apr.Fecha = Convert.ToDateTime(this.dgvExamenes.CurrentRow.Cells[6].Value.ToString());

                            string materia = this.dgvExamenes.CurrentRow.Cells[4].Value.ToString();

                            string carrera = this.dgvExamenes.CurrentRow.Cells[5].Value.ToString();

                            int mat_id = Convert.ToInt32(createMateria.FindAllMaterias().Select("mat_nombre = '" + materia + "' AND car_nombre = '" + carrera + "'")[0]["mat_id"]);

                            bo.Materiabo mat = new bo.Materiabo(mat_id, materia, carrera);

                            apr.Materia = mat;

                            apr.Nota = this.dgvExamenes.CurrentRow.Cells[7].Value.ToString();

                            bool aprobada = createAprobada.SaveAprobada(apr);
                        }

                        refreshData();
                    }
                    else
                    {
                        MessageBox.Show("Error al Intentar Registrar!!", "Alerta", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                    }
                }
            }
            catch (exceptions.blexception)
            {
                MessageBox.Show("Error al Intentar Guardar!!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            }
            catch (Exception ex)
            {
                MessageBox.Show("Error al Intentar Guardar!!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                Gestión_UTN.util.EscribirLog.escribirArchivo(ex.Message);
            }
        }

        private void bindingNavigatorDeleteItem_Click(object sender, EventArgs e)
        {
            try
            {
                if (0 != dni && 0 != fe_id)
                {
                    DialogResult resp = MessageBox.Show("¿Desea eliminar la nota?", "Eliminar Nota", MessageBoxButtons.YesNo, MessageBoxIcon.Question);

                    if (resp == System.Windows.Forms.DialogResult.Yes)
                    {
                        bool eliminada = createNota.DeleteNota(dni, fe_id);

                        if (eliminada)
                        {
                            MessageBox.Show("Nota Eliminada!!", "Exito", MessageBoxButtons.OK, MessageBoxIcon.Information);

                            if (this.dgvExamenes.CurrentRow.Cells[3].Value.ToString().Equals("Final"))
                            {
                                bo.Aprobadabo apr = new bo.Aprobadabo();

                                apr.Alumno = createAlumno.FindAlumnoByDNI(dni);

                                apr.Fecha = Convert.ToDateTime(this.dgvExamenes.CurrentRow.Cells[6].Value.ToString());

                                string materia = this.dgvExamenes.CurrentRow.Cells[4].Value.ToString();

                                string carrera = this.dgvExamenes.CurrentRow.Cells[5].Value.ToString();

                                int mat_id = Convert.ToInt32(createMateria.FindAllMaterias().Select("mat_nombre = '" + materia + "' AND car_nombre = '" + carrera + "'")[0]["mat_id"]);

                                bo.Materiabo mat = new bo.Materiabo(mat_id, materia, carrera);

                                apr.Materia = mat;

                                bool delAprobada = createAprobada.DeleteAprobada(apr);
                            }

                            refreshData();
                        }
                        else
                        {
                            MessageBox.Show("Error al Intentar Eliminar!!", "Alerta", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                        }
                    }
                }
            }
            catch (exceptions.blexception)
            {
                MessageBox.Show("Error al Intentar Eliminar!!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            }
            catch (Exception ex)
            {
                MessageBox.Show("Error al Intentar Eliminar!!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                Gestión_UTN.util.EscribirLog.escribirArchivo(ex.Message);
            }
        }

        private void tsbtnModificar_Click(object sender, EventArgs e)
        {
            try
            {
                if (0 != dni && 0 != fe_id)
                {
                    string nota = this.dgvExamenes.CurrentRow.Cells[7].Value.ToString();

                    bo.Alumnobo alu = new bo.Alumnobo();

                    alu.Dni = dni;

                    bo.FechaExamenbo fechaExamen = new bo.FechaExamenbo();

                    fechaExamen.Fe_id = fe_id;

                    bo.Notabo n = new bo.Notabo(alu, fechaExamen, nota);

                    bool modificada = createNota.ModifyNota(n);

                    if (modificada)
                    {
                        MessageBox.Show("Nota Modificada!!", "Exito", MessageBoxButtons.OK, MessageBoxIcon.Information);

                        double calificacion = Convert.ToDouble(this.dgvExamenes.CurrentRow.Cells[7].Value.ToString());

                        if (this.dgvExamenes.CurrentRow.Cells[3].Value.ToString().Equals("Final") && calificacion >= 4)
                        {
                            bo.Aprobadabo apr = new bo.Aprobadabo();

                            apr.Alumno = alu;

                            apr.Fecha = Convert.ToDateTime(this.dgvExamenes.CurrentRow.Cells[6].Value.ToString());

                            string materia = this.dgvExamenes.CurrentRow.Cells[4].Value.ToString();

                            string carrera = this.dgvExamenes.CurrentRow.Cells[5].Value.ToString();

                            int mat_id = Convert.ToInt32(createMateria.FindAllMaterias().Select("mat_nombre = '" + materia + "' AND car_nombre = '" + carrera + "'")[0]["mat_id"]);

                            bo.Materiabo mat = new bo.Materiabo(mat_id, materia, carrera);

                            apr.Materia = mat;

                            apr.Nota = this.dgvExamenes.CurrentRow.Cells[7].Value.ToString();

                            bo.Aprobadabo apr_anterior = new bo.Aprobadabo();

                            apr.Alumno = alu;

                            apr.Fecha = Convert.ToDateTime(this.dgvExamenes.CurrentRow.Cells[6].Value.ToString());

                            string mate_ant = this.dgvExamenes.CurrentRow.Cells[4].Value.ToString();

                            string car_ant = this.dgvExamenes.CurrentRow.Cells[5].Value.ToString();

                            int mat_id_ant = Convert.ToInt32(createMateria.FindAllMaterias().Select("mat_nombre = '" + mate_ant + "' AND car_nombre = '" + car_ant + "'")[0]["mat_id"]);

                            bo.Materiabo mat_ant = new bo.Materiabo(mat_id, materia, carrera);

                            apr_anterior.Materia = mat_ant;

                            apr_anterior.Nota = this.dgvExamenes.CurrentRow.Cells[7].Value.ToString();

                            bool aprobada = createAprobada.ModifyAprobada(apr, apr_anterior);
                        }

                        refreshData();
                    }
                    else
                    {
                        MessageBox.Show("Error al Intentar Modificar!!", "Alerta", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                    }
                }
            }
            catch (exceptions.blexception)
            {
                MessageBox.Show("Error al Intentar Modificar!!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            }
            catch (Exception ex)
            {
                MessageBox.Show("Error al Intentar Modificar!!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                Gestión_UTN.util.EscribirLog.escribirArchivo(ex.Message);
            }
        }

        private void dgvExamenes_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            if (this.dgvExamenes.CurrentCell.Value != null)
            {
                dni = Convert.ToInt32(this.dgvExamenes.CurrentRow.Cells[0].Value.ToString());

                string fecha_examen = this.dgvExamenes.CurrentRow.Cells[6].Value.ToString();

                string materia = this.dgvExamenes.CurrentRow.Cells[4].Value.ToString();

                string carrera = this.dgvExamenes.CurrentRow.Cells[5].Value.ToString();

                fe_id = Convert.ToInt32(notas.Select("alu_dni = " + dni + " AND fe_fecha = '" + fecha_examen + "' AND mat_nombre = '" +
                    materia + "' AND car_nombre = '" + carrera + "'")[0]["fe_id"]);
            }
        }

        private void refreshData()
        {
            notas = createNota.FindAllNotas();

            if (null != notas)
            {
                this.navegador.BindingSource = this.bsource;
                this.bsource.DataSource = notas;
                this.dgvExamenes.DataSource = this.bsource;

                string[] filtros = { "DNI", "Nombre", "Apellido", "Materia" };

                this.tscmbFiltro.Items.AddRange(filtros);

                this.tscmbFiltro.Text = "Filtrar por...";

                this.dgvExamenes.Columns.Remove("fe_id");
                this.dgvExamenes.Columns[0].HeaderText = "DNI";
                this.dgvExamenes.Columns[1].HeaderText = "Nombre";
                this.dgvExamenes.Columns[2].HeaderText = "Apellido";
                this.dgvExamenes.Columns[3].HeaderText = "Tipo de Examen";
                this.dgvExamenes.Columns[4].HeaderText = "Materia";
                this.dgvExamenes.Columns[5].HeaderText = "Carrera";
                this.dgvExamenes.Columns[6].HeaderText = "Fecha de Examen";
                this.dgvExamenes.Columns[7].HeaderText = "Nota";
            }
        }

        private void tstxtFiltro_TextChanged(object sender, EventArgs e)
        {
            try
            {
                if (string.IsNullOrEmpty(tstxtFiltro.Text.Trim()))
                {
                    this.bsource.RemoveFilter();
                    return;
                }

                if (tscmbFiltro.Text.Equals("DNI"))
                {
                    this.bsource.Filter = "CONVERT(alu_dni,System.String) LIKE '%" + tstxtFiltro.Text + "%'";
                }
                else if (tscmbFiltro.Text.Equals("Nombre"))
                {
                    this.bsource.Filter = "alu_nombre LIKE '%" + tstxtFiltro.Text + "%'";
                }
                else if (tscmbFiltro.Text.Equals("Apellido"))
                {
                    this.bsource.Filter = "alu_apellido LIKE '%" + tstxtFiltro.Text + "%'";
                }
                else if (tscmbFiltro.Text.Equals("Materia"))
                {
                    this.bsource.Filter = "mat_nombre LIKE '%" + tstxtFiltro.Text + "%'";
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Error al Aplicar el Filtro!!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                Gestión_UTN.util.EscribirLog.escribirArchivo(ex.Message);
            }
        }

        private void tsbtnRegularizar_Click(object sender, EventArgs e)
        {
            try
            {
                if (0 != dni && 0 != fe_id)
                {
                    DialogResult resp = MessageBox.Show("¿Desea marcar la materia como Regular?", "Regularizar", MessageBoxButtons.YesNo, MessageBoxIcon.Question);

                    if (resp == System.Windows.Forms.DialogResult.Yes)
                    {
                        string nota = this.dgvExamenes.CurrentRow.Cells[7].Value.ToString();

                        bo.Alumnobo alu = new bo.Alumnobo();

                        alu.Dni = dni;

                        string materia = this.dgvExamenes.CurrentRow.Cells[4].Value.ToString();

                        string carrera = this.dgvExamenes.CurrentRow.Cells[5].Value.ToString();

                        int mat_id = Convert.ToInt32(createMateria.FindAllMaterias().Select("mat_nombre = '" + materia + "' AND car_nombre = '" + carrera + "'")[0]["mat_id"]);

                        bo.Materiabo mat = new bo.Materiabo(mat_id, materia, carrera);

                        DateTime fecha = Convert.ToDateTime(this.dgvExamenes.CurrentRow.Cells[6].Value.ToString());

                        bo.Regularidadbo reg = new bo.Regularidadbo(alu, mat, fecha);

                        bool regularizada = createRegularidad.SaveRegularidad(reg);

                        if (regularizada)
                        {
                            MessageBox.Show("Regularidad Registrada!!", "Exito", MessageBoxButtons.OK, MessageBoxIcon.Information);

                            refreshData();
                        }
                        else
                        {
                            MessageBox.Show("Error al Intentar Registrar!!", "Alerta", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                        }
                    }
                }
            }
            catch (exceptions.blexception)
            {
                MessageBox.Show("Error al Intentar Registrar!!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            }
            catch (Exception ex)
            {
                MessageBox.Show("Error al Intentar Registrar!!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                Gestión_UTN.util.EscribirLog.escribirArchivo(ex.Message);
            }
        }
    }
}
